package cn.jr.util;

import static cn.jr.util.ConsoleStyleUtils.*;

/**
 * 控制台向左滚动广告工具类（带固定标题）
 * 实现文字从右向左滚动，最左端固定显示"广告"二字
 */
@SuppressWarnings("all")
public class ConsoleScrollAdUtils {

    private String adContent;//广告内容
    private int interval;//滚动间隔时间(毫秒)
    private int screenWidth;//控制台显示宽度（
    private int currentPos;//当前滚动位置
    private static final String FIXED_TITLE = "广告：";//固定显示的标题
    /**
     * 构造方法
     * @param adContent 广告内容
     * @param interval 滚动间隔(毫秒)
     * @param screenWidth 显示宽度（不含固定标题）
     */
    public ConsoleScrollAdUtils(String adContent, int interval, int screenWidth) {
        this.adContent = adContent;
        this.interval = interval;
        this.screenWidth = screenWidth;
        // 初始位置从显示区域最右侧开始
        this.currentPos = screenWidth;
    }

    /**
     * 开始滚动显示广告
     * @throws InterruptedException 线程中断异常
     */
    public void startScroll() throws InterruptedException {
        // 滚动直到广告完全移出显示区域
        while (currentPos > -adContent.length()) {
            display();
            currentPos--; // 向左移动一个位置
            Thread.sleep(interval);
        }
        // 滚动结束后清除当前行并换行
        clearCurrentLine();
        System.out.println();
    }

    /**
     * 显示当前帧的广告
     */
    private void display() {
        reset(); // 光标回到行首
        StringBuilder sb = new StringBuilder();

        // 先添加固定显示的"广告"二字
        sb.append(FIXED_TITLE);

        // 计算当前需要显示的滚动内容
        for (int i = 0; i < screenWidth; i++) {
            // 计算当前位置对应的广告字符索引
            int contentIndex = i - currentPos;
            // 如果在广告内容范围内则显示广告字符，否则显示空格
            if (contentIndex >= 0 && contentIndex < adContent.length()) {
                sb.append(adContent.charAt(contentIndex));
            } else {
                sb.append(' ');
            }
        }

        printStyled(sb.toString(),RED, BOLD, BG_GREEN, UNDERLINE);
    }

    /**
     * 清除当前行内容
     */
    private void clearCurrentLine() {
        reset();
        // 构建与当前行等长的空格字符串
        StringBuilder blank = new StringBuilder();
        blank.append(FIXED_TITLE);
        for (int i = 0; i < screenWidth; i++) {
            blank.append(' ');
        }
        printStyled(blank.toString(), RED, BOLD, BG_GREEN, UNDERLINE);
        reset(); // 回到行首
    }

    /**
     * 光标移动到行首
     */
    private void reset() {
        printStyled("\r");
    }

    /**
     * 调用示例
     */
    public static void guangGao()  {
        // 创建广告实例：广告内容、间隔20毫秒、显示宽度78（总宽度为78+2=80）
        ConsoleScrollAdUtils scrollAd = new ConsoleScrollAdUtils(
                "欢迎使用我们吉软的产品！限时优惠活动进行中，全场8折，快来抢购吧！",
                20,
                58  // 预留2个字符给固定标题
        );
        // 开始滚动
        try {
            scrollAd.startScroll();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        printlnStyled(leftAlign("欢迎使用我们吉软的产品！限时优惠活动进行中，全场8折，快来抢购吧！",42),RED, BOLD);
    }
}